package 创建线程第一种方式;

/**
 * @作者:侯国威
 * @时间: 2020/4/10/19:00
 * @邮箱:1045077189@qq.com 创建三个窗口卖票，总票数为100；
 * <p>
 * 实现线程安全问题用synchronized(任意对象){
 * 方法一:同步代码块
 * 1、操作共享数据的代码，即为需要被同步的代码
 * 2、共享数据：多个线程共同操作的变量
 * 3、同步监视器即为 锁；要求多个线程必须共用同一个锁
 * 4、操作同步代码块时相当于单线程，也就是在多个线程下，只能有一个线程在参与，降低了效率
 * <p>
 * }
 * 使用方法二(同步方法):
 * lock锁
 * -------------------------------
 * 面试题synchroizend 与lock的异同：
 * 相同：两者都可以解决线程安全问题
 * 不同：synchroizend再执行完相应的同步代码块以后，自动释放同步监视器
 *  lock需要手动的启动同步锁(lock()开   uplock()关)
 *
 *
 *
 *
 */
public class deom {
    public static void main(String[] args) {
        First first = new First();
        first.start();
        First first1 = new First();
        first1.start();
        First first2 = new First();
        first2.start();

    }
}

class First extends Thread {
    private static int ticket = 100;


    @Override
    public void run() {
        //final Object object =new Object(); 不会报错但是出现每个线程都有自己的锁
        while (true) {
            synchronized (this) {
                if (ticket > 0) {

                    System.out.println("我是线程:" + currentThread().getName() + "票号:" + ticket);

                    ticket--;
                }else {
                    break;
                }

            }
        }
    }
}
//class second extends Thread{
//    @Override
//    public void run() {
//        super.run();
//    }
//}
//class third extends Thread{
//    @Override
//    public void run() {
//        super.run();
//    }
//}

